package com.qf.business.user.core.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.business.user.core.dao.SysDepartmentDao;
import com.qf.business.user.core.service.SysDepartmentService;
import com.qf.commons.core.exception.ServiceException;
import com.qf.commons.data.result.RCodes;
import com.qf.commons.redis.annotation.KLock;
import com.qf.data.user.entity.SysDepartment;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 部门表(SysDepartment)表服务实现类
 *
 * @author makejava
 * @since 2022-08-31 14:10:52
 */
@Service("sysDepartmentService")
@Transactional
@CacheConfig(cacheNames = "depcache")
public class SysDepartmentServiceImpl extends ServiceImpl<SysDepartmentDao, SysDepartment> implements SysDepartmentService {

    @Override
    @Cacheable(key = "'list'")
    public List<SysDepartment> list() {

        //查询redis
        //redis为null
        //1W线程
        //-----添加分布式锁
        //查询redis
        //redis为null return
        //查询数据库
        //重建redis
        //-----释放分布式锁

        System.out.println("查询了数据库！");
        return super.list();
    }

    /**
     * 保存部门
     * @param entity 部门实体信息
     * @return 是否保存成功
     */
    @Override
    @KLock("'dep-' + #entity.id")
    @Transactional
    public boolean save(SysDepartment entity) {
        //判断部门是否存在
        Long count = this.query().eq("dep_name", entity.getDepName()).count();
        if (count > 0) {
            throw new ServiceException(RCodes.DATA_UNIQUE_ERROR);
        }

        //通过事件总线，将保存的部门数据 发送给Es，让ES将部门信息索引到索引库中，方便后续的搜索
//        EventTemplate.sendQuickly("dep_insert", entity);

        return super.save(entity);
    }

    //    /**
//     * 秒杀的业务
//     * Spel表达式
//     *
//     * @param gid
//     * @return
//     */
//    @Override
//    @Transactional
//    @KLock("'goods-' + #{gid}")
//    public int miaosha(Integer gid) {
//        LockUtils.lock("goods-" + gid);
//
//        //通过商品id 查询商品库存 -> mysql
//        //判断商品库存是否足够
//        if(){
//            //库存足够
//            //扣减库存 -1 -> mysql
//            //生成订单
//        } eles {
//            //返回库存不足
//        }
//
//        LockUtils.unlock();
//        return 0;
//    }
}

